{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "*************************************************\n",
    "*************************************************\n",
    "<h1 align=center>第四章 辅助商家实现市场价格发现</h1> \n",
    "\n",
    "<a id=\"ref10\"></a>\n",
    "## 目录表\n",
    "\n",
    "<div class=\"alert alert-block alert-info\" style=\"margin-top: 20px\">\n",
    "<li><a href=\"#ref11\">实验4-1 利用决策树算法构建价格预测模型</a></li>\n",
    "<li><a href=\"#ref12\">实验4-2 基于模型辅助商家实现市场价格发现</a></li>\n",
    "\n",
    "    \n",
    "<br>\n",
    "<p></p>\n",
    "</div>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "************************************************************\n",
    "************************************************************\n",
    "<a id=\"ref11\"></a>\n",
    "<h2 align=center>实验4-1 利用决策树算法构建价格预测模型</h2>\n",
    "\n",
    "建议课时：40分钟\n",
    "\n",
    "## 一、实验目的\n",
    "\n",
    "1、sssss\n",
    "\n",
    "2、了解sklearn，xgboost的使用\n",
    "\n",
    "## 二、实验环境\n",
    "\n",
    "Python3开发环境，第三方包有pandas，sklearn，xgboost\n",
    "\n",
    "## 三、实验原理\n",
    "\n",
    "本节将利用决策树算法构建价格预测模型，需要利用的第三方包有sklearn，xgboost。在机器学习中，决策树是一个预测模型，他代表的是对象属性与对象值之间的一种映射关系。Sklearn包含决策树算法的各种常用算法，而xgboost是决策树发展而来的一项集成且高效的算法，在xgboost包中支持一站式调用。\n",
    "\n",
    "## 四、实验步骤讲解\n",
    "本节处理的内容有：\n",
    "模型构建处理流程如下：\n",
    "\n",
    " 1、读取数据\n",
    " \n",
    " 2、平衡数据\n",
    " \n",
    " 3、处理离散型特征\n",
    " \n",
    " 4、划分测试集训练集\n",
    " \n",
    " 5、模型构建\n",
    " \n",
    " 6、模型效果\n",
    " \n",
    "特征选择再转向模型构建，择优保留最佳模型"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 五、实验步骤\n",
    "\n",
    "### 步骤1:读取“wine_processed.csv”数据\n",
    "\n",
    "<div class=\"alert alert-success alertsuccess\" style=\"margin-top: 10px\">\n",
    "代码示例：\n",
    "</div>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "ename": "FileNotFoundError",
     "evalue": "[Errno 2] File wine_processed.csv does not exist: 'wine_processed.csv'",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mFileNotFoundError\u001b[0m                         Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-7-2d7ea146bfad>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m      1\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mpandas\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0mpd\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 2\u001b[1;33m \u001b[0mdf\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mpd\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mread_csv\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"wine_processed.csv\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m      3\u001b[0m \u001b[0mdf\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mhead\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m2\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32m~\\Anaconda3\\lib\\site-packages\\pandas\\io\\parsers.py\u001b[0m in \u001b[0;36mparser_f\u001b[1;34m(filepath_or_buffer, sep, delimiter, header, names, index_col, usecols, squeeze, prefix, mangle_dupe_cols, dtype, engine, converters, true_values, false_values, skipinitialspace, skiprows, skipfooter, nrows, na_values, keep_default_na, na_filter, verbose, skip_blank_lines, parse_dates, infer_datetime_format, keep_date_col, date_parser, dayfirst, cache_dates, iterator, chunksize, compression, thousands, decimal, lineterminator, quotechar, quoting, doublequote, escapechar, comment, encoding, dialect, error_bad_lines, warn_bad_lines, delim_whitespace, low_memory, memory_map, float_precision)\u001b[0m\n\u001b[0;32m    674\u001b[0m         )\n\u001b[0;32m    675\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 676\u001b[1;33m         \u001b[1;32mreturn\u001b[0m \u001b[0m_read\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mfilepath_or_buffer\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mkwds\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    677\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    678\u001b[0m     \u001b[0mparser_f\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m__name__\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mname\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32m~\\Anaconda3\\lib\\site-packages\\pandas\\io\\parsers.py\u001b[0m in \u001b[0;36m_read\u001b[1;34m(filepath_or_buffer, kwds)\u001b[0m\n\u001b[0;32m    446\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    447\u001b[0m     \u001b[1;31m# Create the parser.\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 448\u001b[1;33m     \u001b[0mparser\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mTextFileReader\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mfp_or_buf\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mkwds\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    449\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    450\u001b[0m     \u001b[1;32mif\u001b[0m \u001b[0mchunksize\u001b[0m \u001b[1;32mor\u001b[0m \u001b[0miterator\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32m~\\Anaconda3\\lib\\site-packages\\pandas\\io\\parsers.py\u001b[0m in \u001b[0;36m__init__\u001b[1;34m(self, f, engine, **kwds)\u001b[0m\n\u001b[0;32m    878\u001b[0m             \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0moptions\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m\"has_index_names\"\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mkwds\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m\"has_index_names\"\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    879\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 880\u001b[1;33m         \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_make_engine\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mengine\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    881\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    882\u001b[0m     \u001b[1;32mdef\u001b[0m \u001b[0mclose\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32m~\\Anaconda3\\lib\\site-packages\\pandas\\io\\parsers.py\u001b[0m in \u001b[0;36m_make_engine\u001b[1;34m(self, engine)\u001b[0m\n\u001b[0;32m   1112\u001b[0m     \u001b[1;32mdef\u001b[0m \u001b[0m_make_engine\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mengine\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;34m\"c\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   1113\u001b[0m         \u001b[1;32mif\u001b[0m \u001b[0mengine\u001b[0m \u001b[1;33m==\u001b[0m \u001b[1;34m\"c\"\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 1114\u001b[1;33m             \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_engine\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mCParserWrapper\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mf\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0moptions\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m   1115\u001b[0m         \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   1116\u001b[0m             \u001b[1;32mif\u001b[0m \u001b[0mengine\u001b[0m \u001b[1;33m==\u001b[0m \u001b[1;34m\"python\"\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32m~\\Anaconda3\\lib\\site-packages\\pandas\\io\\parsers.py\u001b[0m in \u001b[0;36m__init__\u001b[1;34m(self, src, **kwds)\u001b[0m\n\u001b[0;32m   1889\u001b[0m         \u001b[0mkwds\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m\"usecols\"\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0musecols\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   1890\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 1891\u001b[1;33m         \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_reader\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mparsers\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mTextReader\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0msrc\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mkwds\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m   1892\u001b[0m         \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0munnamed_cols\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_reader\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0munnamed_cols\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   1893\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32mpandas\\_libs\\parsers.pyx\u001b[0m in \u001b[0;36mpandas._libs.parsers.TextReader.__cinit__\u001b[1;34m()\u001b[0m\n",
      "\u001b[1;32mpandas\\_libs\\parsers.pyx\u001b[0m in \u001b[0;36mpandas._libs.parsers.TextReader._setup_parser_source\u001b[1;34m()\u001b[0m\n",
      "\u001b[1;31mFileNotFoundError\u001b[0m: [Errno 2] File wine_processed.csv does not exist: 'wine_processed.csv'"
     ]
    }
   ],
   "source": [
    "import pandas as pd\n",
    "df = pd.read_csv(\"wine_processed.csv\")\n",
    "df.head(2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 步骤2:平衡数据\n",
    "观察每个类别的数据，采用欠采样/过采样的方法对数据进行平衡处理\n",
    "<div class=\"alert alert-success alertsuccess\" style=\"margin-top: 10px\">\n",
    "代码示例：\n",
    "</div>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "price\n",
       "0-50                        1842\n",
       "100-150                     1425\n",
       "1000-2000                    226\n",
       "150-250                     1699\n",
       "2000-9223372036854775807     414\n",
       "250-500                     1590\n",
       "50-100                      3029\n",
       "500-1000                     726\n",
       "dtype: int64"
      ]
     },
     "execution_count": 75,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.groupby(\"price\").size()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "由此可见，[1000-2000],[2000-MAX],[500-1000]的价格区间需要增长一定的量，通过复制的方式增加该价格区间的数据量；[50-100]的数据量较多，欠采样该价格区间的数据。\n",
    "<div class=\"alert alert-success alertsuccess\" style=\"margin-top: 10px\">\n",
    "代码示例：\n",
    "</div>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "price\n",
      "0-50                        1842\n",
      "100-150                     1425\n",
      "1000-2000                   1582\n",
      "150-250                     1699\n",
      "2000-9223372036854775807    1656\n",
      "250-500                     1590\n",
      "50-100                      1515\n",
      "500-1000                    1452\n",
      "dtype: int64\n"
     ]
    }
   ],
   "source": [
    "# 平衡数据\n",
    "tmp1 = df[df.price=='1000-2000']\n",
    "tmp2 = df[df.price=='2000-9223372036854775807']\n",
    "tmp3 = df[df.price=='500-1000']\n",
    "for i in range(6):\n",
    "    df = df.append(tmp1, ignore_index=True)\n",
    "for j in range(3):\n",
    "    df = df.append(tmp2,ignore_index=True)\n",
    "df = df.append(tmp3,ignore_index=True)\n",
    "\n",
    "## 剔除50-100的一半数据\n",
    "tmp4 = df[df.price=='50-100']\n",
    "df = df[df.price!='50-100']\n",
    "df = df.append(tmp4[::2],ignore_index=True)\n",
    "\n",
    "print(df.groupby(\"price\").size())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "从结果看，各个价格区间的数据量持平。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 步骤3:处理离散型特征\n",
    "\n",
    "    算法不允许“绿色”这种非数值型特征，需要做转换处理\n",
    "<div class=\"alert alert-success alertsuccess\" style=\"margin-top: 10px\">\n",
    "代码示例：\n",
    "</div>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(12761, 33)\n",
      "(12761,)\n"
     ]
    }
   ],
   "source": [
    "# 划分X,Y\n",
    "X = df[df.columns.difference(['price'])]      \n",
    "Y = df['price']\n",
    "print(X.shape)\n",
    "print(Y.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/usr/local/python3/lib/python3.6/site-packages/ipykernel_launcher.py:10: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n",
      "  # Remove the CWD from sys.path while we load stuff.\n"
     ]
    }
   ],
   "source": [
    "# 对非字符型特征进行数值编码\n",
    "# X = pd.get_dummies(X)        #onehot编码\n",
    "from sklearn.preprocessing import LabelEncoder\n",
    "le = LabelEncoder()\n",
    "features = [col for col in X.columns.values if X[col].dtype == \"object\"]         #筛选出object类型的特征\n",
    "encoders = dict()\n",
    "for f in features:\n",
    "    cc = le.fit(X[f])\n",
    "    encoders[f] = cc.classes_\n",
    "    X[f] = cc.transform(X[f])\n",
    "#     X[f] = le.fit_transform(X[f])\n",
    "\n",
    "# 保存字符转换的规则\n",
    "import pickle\n",
    "with open(\"encoders.dict\", \"wb\") as f:\n",
    "    pickle.dump(encoders, f)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "alcohol                    float64\n",
       "keyword                      int64\n",
       "year                         int64\n",
       "产区                           int64\n",
       "仙粉黛（Zinfandel）               int64\n",
       "佳美娜（Carmenere）               int64\n",
       "佳美（Gamay）                    int64\n",
       "其它                           int64\n",
       "内比奥罗（Nebbiolo）               int64\n",
       "冰酒/贵腐/甜酒                     int64\n",
       "匹诺塔吉（Pinotage）               int64\n",
       "原产地                          int64\n",
       "口感                           int64\n",
       "品丽珠（Cabernet Franc）          int64\n",
       "国产/进口                        int64\n",
       "果味葡萄酒                        int64\n",
       "桃红葡萄酒                        int64\n",
       "桑娇维塞（Sangiovese）             int64\n",
       "梅洛（Merlot）                   int64\n",
       "特性                           int64\n",
       "甜度                           int64\n",
       "白葡萄酒                         int64\n",
       "红葡萄酒                         int64\n",
       "蛇龙珠（Cabernet Gernischt）      int64\n",
       "西拉/设拉子（Syrah/Shiraz）         int64\n",
       "赤霞珠（Cabernet Sauvignon）      int64\n",
       "起泡酒/香槟                       int64\n",
       "长相思（Sauvignon Blanc）         int64\n",
       "雷司令（Riesling）                int64\n",
       "霞多丽（Chardonnay）              int64\n",
       "颜色                           int64\n",
       "马尔贝克（Malbec）                 int64\n",
       "黑皮诺（Pinot Noir）              int64\n",
       "dtype: object"
      ]
     },
     "execution_count": 79,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X.dtypes"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 步骤4：划分测试集训练集\n",
    "<div class=\"alert alert-success alertsuccess\" style=\"margin-top: 10px\">\n",
    "代码示例：\n",
    "</div>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "accuarcy: 68.31%\n",
      "                  precision    recall  f1-score   support\n",
      "\n",
      "            0-50       0.77      0.67      0.72       439\n",
      "          50-100       0.51      0.53      0.52       266\n",
      "         100-150       0.98      0.90      0.94       369\n",
      "         150-250       0.55      0.59      0.57       324\n",
      "         250-500       0.96      0.94      0.95       313\n",
      "        500-1000       0.51      0.56      0.53       285\n",
      "       1000-2000       0.37      0.41      0.39       249\n",
      "2000-sys.maxsize       0.76      0.73      0.75       308\n",
      "\n",
      "       micro avg       0.68      0.68      0.68      2553\n",
      "       macro avg       0.67      0.67      0.67      2553\n",
      "    weighted avg       0.70      0.68      0.69      2553\n",
      "\n"
     ]
    }
   ],
   "source": [
    "from sklearn.model_selection import train_test_split  \n",
    "\n",
    "# 划分数据训练集，测试集\n",
    "# 80%训练集，20%的测试集；为了复现实验，设置一个随机数,划分结果是确定的\n",
    "x_train, x_test, y_train, y_test = train_test_split(X, Y, test_size = 0.2, random_state = 42 )  \n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 步骤5:模型构建\n",
    "<div class=\"alert alert-success alertsuccess\" style=\"margin-top: 10px\">\n",
    "代码示例：\n",
    "</div>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 模型相关（载入模型--训练模型--模型预测）\n",
    "from xgboost import XGBClassifier\n",
    "model = XGBClassifier(learning_rate=0.25, n_estimators=100, objective= \"multi:softmax\", num_class=8, max_depth=12, subsample =0.95)\n",
    "model.fit(x_train,y_train)            # 训练模型（训练集）\n",
    "y_pred = model.predict(x_test)        # 模型预测（测试集），y_pred为预测结果\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 步骤6：模型效果评估\n",
    "<div class=\"alert alert-success alertsuccess\" style=\"margin-top: 10px\">\n",
    "代码示例：\n",
    "</div>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 性能评估\n",
    "from sklearn.metrics import accuracy_score   # 准确率\n",
    "accuracy = accuracy_score(y_test,y_pred)\n",
    "print(\"accuarcy: %.2f%%\" % (accuracy*100.0))\n",
    "\n",
    "from sklearn.metrics import  classification_report\n",
    "#输出详细的分类性能\n",
    "print(classification_report(y_pred,y_test,target_names=['0-50','50-100','100-150','150-250','250-500','500-1000','1000-2000','2000-sys.maxsize']))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 步骤7：特征选择与再训练\n",
    "首先查看模型各个维度的重要性：\n",
    "<div class=\"alert alert-success alertsuccess\" style=\"margin-top: 10px\">\n",
    "代码示例：\n",
    "</div>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "price\n",
       "0-50                        383\n",
       "100-150                     281\n",
       "1000-2000                   341\n",
       "150-250                     352\n",
       "2000-9223372036854775807    308\n",
       "250-500                     312\n",
       "50-100                      280\n",
       "500-1000                    296\n",
       "dtype: int64"
      ]
     },
     "execution_count": 81,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "label = pd.DataFrame(y_test,columns=[\"price\"])\n",
    "label.groupby(\"price\").size()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "prediction\n",
       "0-50                        439\n",
       "100-150                     266\n",
       "1000-2000                   369\n",
       "150-250                     324\n",
       "2000-9223372036854775807    313\n",
       "250-500                     285\n",
       "50-100                      249\n",
       "500-1000                    308\n",
       "dtype: int64"
      ]
     },
     "execution_count": 82,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "prediction = pd.DataFrame(y_pred,columns=[\"prediction\"])\n",
    "prediction.groupby(\"prediction\").size()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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/cZSypbLnLJHKeW/SimPLN09WLp8o5Qyu5Rybynl4F6aHgAA67gHHnggM2bMyLhx47LnnnvmjjvuWGnMVVddlXe/+91Zb7318thjj2X48OHdfcOHD89jjz3WfXzuuedmzJgxOfzww/PMM8/0yhwAoC8TDK7bDq+qamySXZIcXUp529KOUsqoJF9O8j+rqnpnkmMaXd9OcmlVVWOSfD/J/1nmepsl2T3J/knOaLQdmKQtyTuTfCjJN0opm625KQEAUBeLFy/OH/7wh9x22235xje+kb/7u7/r/s7AJLnvvvty4okn5sILL3zNax111FF5+OGHM3PmzGy22WaZNGnSmiwdANYKLc0ugDXq6FLK+MbrdyTZbpm+/5nkR1VVPZ0kVVX9odG+W7rCviS5LMnXlznn6qqqXklyfyll00bb7kmmVlW1JMnvSym3JHlPknterajG7sUjkmTIkKE5uXXxqs4P1lmbDkwmWRuwEmsDera2r42Ojo4kyZNPPplFixZ1Hw8aNCjbbLNNbrnlliTJSy+9lGnTpmXjjTfOU089lc9//vM54YQTMm/evMybNy8LFizIAw880H3+jTfemFJK9/FSra2t+cEPfrBSO+uehQsX+nuGHlgbLCUYXEeVUtrTtYNvt6qq/lRK6Uiy/pu87IvLvsWqXqSqqouSXJQkW24zspp8r19DWNGk1sWxNmBl1gb0bG1fG50T2rv+7OzM4MGD097edXz44Yfn8ccfT3t7ex544IH069cvf/u3f5s//vGP2XPPPXPOOefkwAMPXO5aZ555ZtZff/2MGzcuZ555Zj73uc+lvb09TzzxRDbbrOvGlrPOOivjxo3rfh/WXR0dHf6eoQfWBku5lXjdtVGSZxqh4I5Jdl2h/6YkH1t6e3EpZek3Pf9XkkMaryckmfEa7zMjycGllP6llKFJ9khy++qYAAAA9XHooYdmt912y9y5czN8+PB85zvfyeGHH55HHnkko0ePziGHHJJLL700pZSce+65eeihh3Lqqaemra0tbW1tmT9/fpLk/PPPz6c+9amMHDky2267bfbZZ58kyQknnJDW1taMGTMmN998c84666xmThcA+oS1938r8lqmJzmylDInydwkty3bWVXVfaWU05LcUkpZkuTuJBOTfC7Jv5ZSjk/yVJJPvMb7/CRdtx/PSlIlOaGqqidLKSNW31QAAFjXTZ06tcf2yy+/fKW2L3/5y/nyl7/c4/hddtkls2fPXqn9sssue3MFAsA6SDC4jqqq6sUk+/TQNWKZMZcmuXSF836bru8fXPF6E1c43qDxZ5Xk+MbPsv2dSUavSu0AAAAArHluJQYAAACAGhIMAgAAAEANCQYBAAAAoIYEgwAAAABQQ4JBAAAAAKghwSAAAAAA1JBgEAAAAABqqKXZBVBvAwf0z9wz9mt2GdDndHR0pHNCe7PLgD7H2oCeWRsAwKqwYxAAAAAAakgwCAAAAAA1JBgEAAAAgBoSDAIAAABADQkGAQAAAKCGBIMAAAAAUEOCQQAAAACoIcEgAAAAANSQYBAAAAAAakgwCAAAAAA1JBgEAAAAgBoSDAIAAABADQkGAQAAAKCGBIMAAAAAUEOCQQAAAACoIcEgAAAAANSQYBAAAAAAakgwCAAAAAA1JBgEAAAAgBoSDAIAAABADQkGAQAAAKCGBIMAAAAAUEOCQQAAAACooZZmF0C9vfDykow46WfNLgP6nEmtizPR2oCVWBt9V+cZ+zW7BAAA3iA7BgEAAACghgSDAAAAAFBDgkEAAAAAqCHBIAAAAADUkGAQAAAAAGpIMAgAAAAANSQYBABgtTj88MMzbNiwjB49urvt+OOPz4477pgxY8Zk/PjxefbZZ5MknZ2dGThwYNra2tLW1pYjjzyy+5ypU6emtbU1Y8aMyYc//OE8/fTTSZJZs2Zlt912S2traw444IA899xzvTtBAIB1jGAQAIDVYuLEiZk+ffpybXvttVdmz56de+65J9tvv31OP/307r5tt902M2fOzMyZMzNlypQkyeLFi3PMMcfk5ptvzj333JMxY8bk3HPPTZJ86lOfyhlnnJF7770348ePzze+8Y3emxwAwDpIMMgaVUrp3+waAIDesccee2STTTZZrm3vvfdOS0tLkmTXXXfN7373u794jaqqUlVVFi1alKqq8txzz2XzzTdPkjzwwAPZY489knQFjlddddUamAUAQH0IBulWSjm1lHLsMsenlVKOKaUcX0q5o5RyTynla8v0X11KuauUcl8p5Yhl2heWUiaXUmYl2a2XpwEA9FHf/e53s88++3Qf/+Y3v8m73vWu7LnnnpkxY0aSZMCAAbngggvS2tqazTffPPfff38++clPJklGjRqVadOmJUl+9KMfZd68eb0/CQCAdYhgkGV9N8lhSVJK6ZfkkCRPJtkuyf9I0pZkbCllj8b4w6uqGptklyRHl1Le1mgfnOSXVVW9s6qqW3tzAgBA33TaaaelpaUlEyZMSJJsttlmefTRR3P33XfnW9/6Vj7+8Y/nueeey8svv5wLLrggd999dx5//PGMGTOm+/bj7373uzn//PMzduzYPP/88/mrv/qrZk4JAGCt19LsAug7qqrqLKUsKKW8K8mmSe5O8p4kezdeJ8kG6QoKf56uMHB8o/0djfYFSZYkedV7exq7C49IkiFDhubk1sVrYDawdtt0YDLJ2oCVWBt9V0dHR5LkySefzKJFi7qPk2T69Om59tprM3ny5Nxyyy09nv+2t70tU6dOTVVVeeaZZzJv3rzMmzcv2223XaZOnZrdd989SfLFL34xSTJv3rwMGzZsufeps4ULF/osoAfWBvTM2mApwSAr+r9JJiZ5e7p2EH4wyelVVV247KBSSnuSDyXZraqqP5VSOpKs3+j+c1VVS17tDaqquijJRUmy5TYjq8n3+jWEFU1qXRxrA1ZmbfRdnRPau/7s7MzgwYPT3t51PH369FxzzTW55ZZbMnTo0O7xTz31VDbZZJP0798/jzzySJ566ql87GMfy5///Od87Wtfy6hRozJ06NDceOONed/73pf29vbMnz8/w4YNyyuvvJKJEyfm+OOP736fuuvo6PBZQA+sDeiZtcFS/suaFf0kyalJBiT5eJLFSf65lPL9qqoWllK2SPJyko2SPNMIBXdMsmvTKgYA+oRDDz00HR0defrppzN8+PB87Wtfy+mnn54XX3wxe+21V5KuB5BMmTIlP//5z3PyySdnwIAB6devX6ZMmdL94JKvfvWr2WOPPTJgwIBstdVWueSSS5IkU6dOzXnnnZckOfDAA/OJT3yiKfMEAFhXCAZZTlVVL5VSbk7ybGPX3/WllJ2S/KKUkiQLk/x9kulJjiylzEkyN8ltzaoZAOgbpk6dulLb0geHrOiggw7KQQcd1GPfkUcemSOPPHKl9mOOOSbHHHPMmysSAIBugkGW03joyK5JPra0raqqc5Kc08PwfXpoS1VVG6yZ6gAAAABYXTyVmG6llJ2TPJTkxqqqHmx2PQAAAACsOXYM0q2qqvuTbNPsOgAAAABY8+wYBAAAAIAaEgwCAAAAQA0JBgEAAACghgSDAAAAAFBDgkEAAAAAqCFPJaapBg7on7ln7NfsMqDP6ejoSOeE9maXAX2OtQEAAKuPHYMAAAAAUEOCQQAAAACoIcEgAAAAANSQYBAAAAAAakgwCAAAAAA1JBgEAAAAgBoSDAIAAABADQkGAQAAAKCGBIMAAAAAUEOCQQAAAACoIcEgAAAAANSQYBAAAAAAakgwCAAAAAA1JBgEAAAAgBoSDAIAAABADQkGAQAAAKCGBIMAAAAAUEOCQQAAAACoIcEgAAAAANSQYBAAAAAAakgwCAAAAAA1JBgEAAAAgBoSDAIAAABADbU0uwDq7YWXl2TEST9rdhnQ50xqXZyJ1gZroc4z9mt2CQAAwOtkxyAAAAAA1JBgEAAAAABqSDAIAAAAADUkGAQAAACAGhIMAgAAAEANCQYBAAAAoIYEgwDAanfOOedk9OjRGTVqVM4+++zl+iZPnpxSSp5++ukkSVVVOfroozNy5MiMGTMmv/rVr7rHPvroo9l7772z0047Zeedd86TTz7Zq/MAAIB1mWAQAFitZs+enYsvvji33357Zs2alZ/+9Kd56KGHkiTz5s3L9ddfny233LJ7/L//+7/nwQcfzIMPPpiLLrooRx11VHffYYcdluOPPz5z5szJ7bffno033rjX5wMAAOsqwSAAsFrNmTMn48aNy6BBg9LS0pI999wzP/7xj5Mkxx13XL7+9a+nlNI9ftq0aTnssMNSSsmuu+6aZ599Nk888UTuv//+LF68OHvttVeSZIMNNsj666/flDkBAMC6qKXZBbD2KaWckmTXJIsbTS1JbuupraqqU3q7PgCaa/To0fnSl76UBQsWZODAgbnuuuuyyy67ZNq0adliiy3yzne+c7nxjz32WN7xjnd0Hw8fPjyPPfZYfve732XjjTfOgQcemN/85jf50Ic+lA9/+MO9PR0AAFhnCQZZVYdUVfVskpRSNk5y7Ku0AVAzO+20U0488cTsvffeGTx4cNra2vLiiy/mX/7lX3L99de/7ussXrw4M2bMyN13350tt9wyBx98cKZPn54PfvCDa7B6AACoD8Egva6UckSSI5JkyJChObl18WucAfWz6cBkkrXBWqijoyNJsu2222by5MlJkosvvjhvfetb88ADD2SHHXZIkjz11FMZNWpULrjggpRS8h//8R9ZvLjrd/7BBx/Mb3/728yfPz8jRozIo48+mkcffTQ77LBDZs2a1f0ewH9buHChtQE9sDagZ9YGSwkG6XVVVV2U5KIk2XKbkdXke/0awoomtS6OtcHaqHNCe5Jk/vz5GTZsWB599NHcddddue2223Luued2jxsxYkTuvPPODBkyJOutt17OPffcnHrqqfnlL3+Zt7/97TnooIOyZMmSXHjhhRk1alSGDh2aSy+9NCNHjkx7e3tzJgd9WEdHh7UBPbA2oGfWBkv5VycAsNoddNBBWbBgQQYMGJDzzjvvLz5NeN999811112XkSNHZtCgQfnXf/3XJEn//v3zzW9+Mx/84AdTVVXGjh2b/fffv7ecej6ZAAAgAElEQVSmAAAA6zzBIACw2s2YMeMv9nd2dna/LqXkvPPO63HcXnvtlXvuuaf72C0vAACw+vRrdgEAAAAAQO8TDAIAAABADbmVmFUxP8n3SimvNI77JZn+Km0AAAAA9EGCQd6wqqrOT3J+D109tQEAAADQB7mVGAAAAABqSDAIAAAAADUkGAQAAACAGhIMAgAAAEANefgITTVwQP/MPWO/ZpcBfU5HR0c6J7Q3uwwAAADWYXYMAgAAAEANCQYBAAAAoIYEgwAAAABQQ4JBAAAAAKghwSAAAAAA1JBgEAAAAABqSDAIAAAAADUkGAQAAACAGhIMAgAAAEANCQYBAAAAoIYEgwAAAABQQ4JBAAAAAKghwSAAAAAA1JBgEAAAAABqSDAIAAAAADUkGAQAAACAGhIMAgAAAEANCQYBAAAAoIYEgwAAAABQQ4JBAAAAAKghwSAAAAAA1JBgEAAAAABqSDAIAAAAADXU0uwCqLcXXl6SESf9rNllQJ8zqXVxJlobrEU6z9iv2SUAAABvkB2DAAAAAFBDgkEAAAAAqCHBIAAAAADUkGAQAAAAAGpIMAgAAAAANSQYBAAAAIAaEgwCAKvNOeeck9GjR2fUqFE5++yzkyRf+cpXMmbMmLS1tWXvvffO448/vtw5d9xxR1paWvJv//Zv3W39+/dPW1tb2tra8jd/8ze9OgcAAKgLwSAAsFrMnj07F198cW6//fbMmjUrP/3pT/PQQw/l+OOPzz333JOZM2dm//33z6mnntp9zpIlS3LiiSdm7733Xu5aAwcOzMyZMzNz5sxcc801vT0VAACoBcEgALBazJkzJ+PGjcugQYPS0tKSPffcMz/+8Y+z4YYbdo9ZtGhRSindx9/+9rdz0EEHZdiwYc0oGQAAaq2l2QWw9imlnJJk1ySLG00tSW7rqa2qqlN6uz4AmmP06NH50pe+lAULFmTgwIG57rrrsssuuyRJvvSlL+V73/teNtpoo9x8881Jksceeyw/+clPcvPNN+eOO+5Y7lp//vOfs8suu6SlpSUnnXRSPvKRj/T6fAAAYF1nxyCr6pCqqvavqmr/JIf8hTYAamKnnXbqvi34wx/+cNra2tK/f/8kyWmnnZZ58+ZlwoQJOffcc5Mkxx57bM4888z067fyf4789re/zZ133pkf/OAHOfbYY/Pwww/36lwAAKAO7Bik15VSjkhyRJIMGTI0J7cufo0zoH42HZhMsjZYi3R0dCRJtt1220yePDlJcvHFF2fo0KHdfUmyzTbb5KSTTsoHPvCB3HrrrZkxY0aS5I9//GOmTZuWX//619l9992TJA8++GCSZMcdd8zll1+ePffcMwsXLlzuekAXawN6Zm1Az6wNlhIM0uuqqrooyUVJsuU2I6vJ9/o1hBVNal0ca4O1SeeE9iTJ/PnzM2zYsDz66KO56667ctttt+Wpp57Kdtttl6TrOwXHjh2b9vb2PPHEE93nT5w4Mfvvv38++tGP5plnnsmgQYOy3nrr5emnn87DDz+cb33rW9l5553T0dGR9vb2JswQ+jZrA3pmbUDPrA2W8q9OAGC1Oeigg7JgwYIMGDAg5513XjbeeON88pOfzNy5c9OvX79stdVWmTJlyl+8xpw5c/LpT386/fr1yyuvvJKTTjopO++8cy/NAAAA6kMwCACsNktvDV7WVVdd9ZrnXXLJJd2v3/ve9+bee+9dnWUBAAA98PARAAAAAKghwSAAAAAA1JBbiVkV85N8r5TySuO4X5Lpr9IGAAAAQB8kGOQNq6rq/CTn99DVUxsAAAAAfZBbiQEAAACghgSDAAAAAFBDgkEAAAAAqCHBIAAAAADUkIeP0FQDB/TP3DP2a3YZ0Od0dHSkc0J7s8sAAABgHWbHIAAAAADUkGAQAAAAAGpIMAgAAAAANSQYBAAAAIAaEgwCAAAAQA0JBgEAAACghgSDAAAAAFBDgkEAAAAAqCHBIAAAAADUkGAQAAAAAGpIMAgAAAAANSQYBAAAAIAaEgwCAAAAQA0JBgEAAACghgSDAAAAAFBDgkEAAAAAqCHBIAAAAADUkGAQAAAAAGpIMAgAAAAANSQYBAAAAIAaEgwCAAAAQA0JBgEAAACghgSDAAAAAFBDLc0ugHp74eUlGXHSz5pdBvQ5k1oXZ6K10Ss6z9iv2SUAAAA0hR2DAAAAAFBDgkEAAAAAqCHBIAAAAADUkGAQAAAAAGpIMAgAAAAANSQYBAAAAIAaEgwCUHtz585NW1tb98+GG26Ys88+O8cff3x23HHHjBkzJuPHj8+zzz6bJPn+97+/3Ph+/fpl5syZSZIrr7wyY8aMyahRo3LiiSc2c1oAAAB/kWAQgNrbYYcdMnPmzMycOTN33XVXBg0alPHjx2evvfbK7Nmzc88992T77bfP6aefniSZMGFC9/jLLrssW2+9ddra2rJgwYIcf/zxufHGG3PfffflySefzI033tjk2QEAAPRMMAgAy7jxxhuz7bbbZquttsree++dlpaWJMmuu+6a3/3udyuNnzp1ag455JAkySOPPJLtttsuQ4cOTZJ86EMfylVXXdV7xQMAALwBLc0ugLVPKeWUJLsmWdxoaklyW09tVVWd0tv1AbwZV1xxRQ499NCV2r/73e/m4IMPXqn9yiuvzLRp05IkI0eOzNy5c9PZ2Znhw4fn6quvzksvvbTGawYAAFgVgkFW1SFVVT2bJKWUjZMc+yptAGuNl156Kddcc033LcNLnXbaaWlpacmECROWa//lL3+ZQYMGZfTo0UmSt771rbngggty8MEHp1+/fnnve9+bhx9+uNfqBwAAeCMEg/S6UsoRSY5IkiFDhubk1sWvcQbUz6YDk0nWRq/o6Ojofn3rrbdm6623zpw5czJnzpwkyfTp03Pttddm8uTJueWWW5Y797zzzsu4ceOWu8Zb3vKWnHnmmUmSa6+9Nuuvv/5y/bw5Cxcu9HlCD6wN6Jm1AT2zNlhKMEivq6rqoiQXJcmW24ysJt/r1xBWNKl1cayN3tE5ob379ZQpU/KZz3wm7e1dbdOnT88111yTW265pft7A5d65ZVXMmHChMyYMSPbbLNNd/v8+fMzbNiwPPPMMzn22GPzwx/+MNtvv31vTKUWOjo6uv9+gP9mbUDPrA3ombXBUv7VCQBJFi1alBtuuCEXXnhhd9tnP/vZvPjii9lrr72SdD2AZMqUKUmSn//853nHO96xXCiYJMccc0xmzZqVJDn55JOFggAAQJ8lGASAJIMHD86CBQuWa3vooYdedXx7e3tuu+22ldqnTp262msDAABYE/o1uwAAAAAAoPcJBgEAAACghtxKzKqYn+R7pZRXGsf9kkx/lTYAAAAA+iDBIG9YVVXnJzm/h66e2gAAAADog9xKDAAAAAA1JBgEAAAAgBoSDAIAAABADQkGAQAAAKCGPHyEpho4oH/mnrFfs8uAPqejoyOdE9qbXQYAAADrMDsGAQAAAKCGBIMAAAAAUEOCQQAAAACoIcEgAAAAANSQYBAAAAAAakgwCAAAAAA1JBgEAAAAgBoSDAIAAABADQkGAQAAAKCGBIMAAAAAUEOCQQAAAACoIcEgAAAAANSQYBAAAAAAakgwCAAAAAA1JBgEAAAAgBoSDAIAAABADQkGAQAAAKCGBIMAAAAAUEOCQQAAAACoIcEgAAAAANSQYBAAAAAAakgwCAAAAAA1JBgEAAAAgBpqaXYB1NsLLy/JiJN+1uwyoM+Z1Lo4E62N1abzjP2aXQIAAECfY8cgAAAAANSQYBAAAAAAakgwCAAAAAA1JBgEAAAAgBoSDAIAAABADQkGAQAAAKCGBIMA1MLcuXPT1tbW/bPhhhvm7LPPzo9+9KOMGjUq/fr1y5133tk9fsGCBfnABz6QDTbYIJ/97Ge7259//vnlrjNkyJAce+yxzZgSAADAm9LS7AIAoDfssMMOmTlzZpJkyZIl2WKLLTJ+/Pj86U9/yo9//ON8+tOfXm78+uuvn3/+53/O7NmzM3v27O72t7zlLd3XSZKxY8fmwAMP7J1JAAAArEaCQQBq58Ybb8y2226brbba6lXHDB48OLvvvnseeuihVx3zwAMPZP78+Xn/+9+/JsoEAABYowSDvGGllFOS7JpkcaOpJcltPbVVVXVKb9cH8FquuOKKHHrooavlOgcffHBKKauhKgAAgN4lGGRVHVJV1bNJUkrZOMmxr9IG0Ke89NJLueaaa3L66ae/6WtdccUVueyyy1ZDVQAAAL1PMEivK6UckeSIJBkyZGhObl38GmdA/Ww6MJlkbaw2HR0d3a9vvfXWbL311pkzZ07mzJnT3f7ss8/mrrvuysKFC5c799e//nUee+yx5a6RJA899FCef/75PP/88yv1seYsXLjQ5w09sDagZ9YG9MzaYCnBIL2uqqqLklyUJFtuM7KafK9fQ1jRpNbFsTZWn84J7d2vp0yZks985jNpb29fbszGG2+csWPHZpdddln+3M7OLFy4cKXx06dPz+GHH75SO2tWR0eHzxx6YG1Az6wN6Jm1wVL9ml0AAPSWRYsW5YYbbljuKcI/+clPMnz48PziF7/Ifvvtl7/+67/u7hsxYkQ+//nP55JLLsnw4cNz//33d/f98Ic/XC3fUwgAANAstqMAUBuDBw/OggULlmsbP358xo8f3+P4zs7OV73WI488sjpLAwAA6HV2DAIAAABADQkGAQAAAKCG3ErMqpif5HullFcax/2STH+VNgAAAAD6IMEgb1hVVecnOb+Hrp7aAAAAAOiD3EoMAAAAADUkGAQAAACAGhIMAgAAAEANCQYBAAAAoIY8fISmGjigf+aesV+zy4A+p6OjI50T2ptdBgAAAOswOwYBAAAAoIYEgwAAAABQQ4JBAAAAAKghwSAAAAAA1JBgEAAAAABqSDAIAAAAADUkGAQAAACAGhIMAgAAAEANCQYBAAAAoIYEgwAAAABQQ4JBAAAAAKghwSAAAAAA1JBgEAAAAABqSDAIAAAAADUkGAQAAACAGhIMAgAAAEANCQYBAAAAoIYEgwAAAABQQ4JBAAAAAKghwSAAAAAA1JBgEAAAAABqSDAIAAAAADUkGAQAAACAGmppdgHU2wsvL8mIk37W7DKgz5nUujgTrY03pPOM/ZpdAgAAwFrFjkEAAAAAqCHBIAAAAADUkGAQAAAAAGpIMAgAAAAANSQYBAAAAIAaEgwCAAAAQA0JBgFYZzz77LP56Ec/mh133DE77bRTfvGLX2TWrFnZbbfd0tramgMOOCDPPfdckvx/9u49yq+qvhv/e4eBcAmXH4bYANJIFQMhYUyAoNwm9RfaSpaAWAHz9CFii1p5FC0ICijqT0EuNlGJFFsMAgUFBQQ01cd0BNEoaAIEChRraILclAYSCZDL/v0x3xknYXIBk0yS83qtNSvfs8/Z+3zO5LuzFm/2OSc/+MEPMmbMmIwcOTJjxozJjBkzkiQLFy5Me3t7z8/gwYNz6qmn9udlAQAArBdt/V0AAKwrH/rQh/KXf/mXuf766/Piiy/mueeey/jx43PRRRfl8MMPz+WXX54LL7wwn/nMZzJ48ODcfPPN2XXXXTNnzpz8xV/8RR599NFsv/32mT17ds+YY8aMydvf/vZ+vCoAAID1w4pBADYLzzzzTG677ba85z3vSZJstdVW2WmnnfLQQw/lsMMOS5KMHz8+3/rWt5Ikb3zjG7PrrrsmSUaMGJHFixfnhRdeWGHMhx56KE8++WQOPfTQDXglAAAAG4YVg6xSKeXcJAclWdpqaksycxVt6au91nruhqgV4Ne//nV22WWXvPvd787dd9+dMWPGZMqUKRkxYkRuuummHH300bnuuusyb968l/T91re+ldGjR2fgwIErtF977bU57rjjUkrZUJcBAACwwVgxyJocX2udUGudkOT41bStrh1gvVu6dGl++ctf5v3vf39mzZqV7bbbLueff34uv/zyTJ06NWPGjMnChQuz1VZbrdDvvvvuyxlnnJF/+qd/esmY1157bU444YQNdQkAAAAblBWDbHCllJOTnJwkgwfvkk+MXLqGHtA8r94m+Qdz42X57//+7wwePDiLFy9OZ2dn/uzP/iz/+q//mre85S35+Mc/niSZN29ehgwZks7OziTJU089lY985CP56Ec/mnnz5q2wmvDhhx/OwoULs3Dhwp7j6X+LFi3y9wF9MDegb+YG9M3coJtgkA2u1npZksuSZI89X1cvvtfXEFb2DyOXxtx4eeaef1T+8R//MUOHDs0b3vCGdHZ25tBDD80+++yTIUOGZPny5Zk0aVJOP/30dHR0ZMGCBTn88MMzZcqUPl8uMn369Jx00knp6OjY8BfDKnV2dvo7gT6YG9A3cwP6Zm7Qza3EAGw2vvSlL2XixIkZNWpUZs+enY9//OO55pprstdee2X48OHZdddd8+53vztJ8uUvfzkPP/xwPv3pT6e9vT3t7e158skne8b65je/6TZiAABgs2Y5CgCbjfb29tx1110rtH3oQx/Khz70oZcce/bZZ+fss89e5Vj/9V//tc7rAwAA2JhYMQgAAAAADSQYBAAAAIAGcisxq/Nkkq+XUpa3tgckmb6KtqymHQAAAICNjGCQVaq1Tk0ytY9dfbWtrh0AAACAjYxbiQEAAACggQSDAAAAANBAgkEAAAAAaCDBIAAAAAA0kJeP0K+22XKLPHj+kf1dBmx0Ojs7M3diR3+XAQAAwGbMikEAAAAAaCDBIAAAAAA0kGAQAAAAABpIMAgAAAAADSQYBAAAAIAGEgwCAAAAQAMJBgEAAACggQSDAAAAANBAgkEAAAAAaCDBIAAAAAA0kGAQAAAAABpIMAgAAAAADSQYBAAAAIAGEgwCAAAAQAMJBgEAAACggQSDAAAAANBAgkEAAAAAaCDBIAAAAAA0kGAQAAAAABpIMAgAAAAADSQYBAAAAIAGEgwCAAAAQAMJBgEAAACggdr6uwCabfGSZRl25q39XQZsUHPPP7K/SwAAAAArBgEAAACgiQSDAAAAANBAgkEAAAAAaCDBIAAAAAA0kGAQAAAAABpIMAgAAAAADdTW3wUANNWyZcuy//77Z7fddsstt9ySQw89NAsXLkySzJ8/P4ccckhuvPHGXHjhhbn66quTJEuXLs1//Md/5Kmnnsq2226bww47LC+88EKWLl2ad7zjHfnUpz7Vn5cEAADAJmSTXTFYSvmTUsq1pZRflVJ+UUr5billr9UcP6yUMmcD17hTKeXvV7P/rFLKfaWUe0ops0spY9fx+d9WSjlzXY4JrDtTpkzJ3nvv3bN9++23Z/bs2Zk9e3b22WefvP3tb0+SnH766T3t5513Xg4//PDsvPPOGThwYGbMmJG77747s2fPzvTp0zNz5sz+uhwAAAA2MetlxWAp5dwkByVZ2us83f+1ui7aP5XkhiRX1FqPb51zvySvTvLQur2aLqWUtlrr0jUfuYKdkvx9kql9jPemJBOSjK61vlBKGZxkqz++0j+otX4nyXfW5ZirU0qZmeS3vZpem+TIWuvcDVUDbCrmz5+fW2+9NWeddVa+8IUvrLDv2WefzaxZs3L00Ue/pN8111yTE044IUlSSsmgQYOSJEuWLMmSJUtSSln/xQMAALBZWJ8rBo+vtU6otU5Icvw6bh+XZEmt9dLug2qtd9daby+lDCql/LCU8stSyr2llKN6jdVWSrm6lPIfpZTrSynbJkkpZUwp5UetlYf/VkoZ2mrvLKVMLqXcleRDpZRppZQvllJ+Ukr5r1LKO7oHLqWcXkq5s7X6r/tevvOT/FlrNeCFK/1+hib5ba31hVb9v621/qY11idaY80ppVxWWv+l36pn/9bnwaWUua3PM0spI3rV0llK2b+UMqmU8uVW25+1jru3lPL/lVIWtdo7WsdfX0p5oPX76T7fW0ops1p9Li+lDGy1zy2lfKrX73h469Qzu/+uWn9fX135SwF0OfXUU3PBBRdkwICX/jN84403ZvTo0dlhhx1WaH/uuecyffr0HHvssT1ty5YtS3t7e4YMGZLx48dn7Nh1uvAYAACAzdimeivxvkl+sYp9zyc5ptY6Ol0B4sXdQVeSNySZWmvdO8mzSf6+lLJlki8leUetdUySy5N8ttd4W9Va96+1XtzaHprkkHSt9js/SUopRyR5fZIDk7QnGVNKOSzJmUl+VWttr7WevlKd30/ymlLKQ6WUqaWUw3vt+3Kt9YBa675Jtmmda3W+keSdrVqGJhlaa71rpWOmJJlSax2ZZP5K+96Y5NQk+yTZM8nBpZStk0xLclyrT1uS9/fq89vW7/grSU5bQ31AL7fcckuGDBmSMWPG9Ln/mmuuyZ//+Z+/pP3mm2/OwQcfnJ133rmnbYsttsjs2bMzf/78/PznP8+cORv0iQkAAABswjbHl4+UJJ9rBXPLk+yWrluMk2RerfWO1uerknwwyfR0BY0/aOWHWyR5rNd431hp/BtrrcuT3F9K6R73iNbPrNb2oHQFhf+9qiJrrYtKKWOSHJquAPMbpZQza63TkowrpXw0ybZJdk5yX5KbV3PN30xX0PjJdAWE1/dxzJuSdN+X+K9JLuq17+e11vlJUkqZnWRYkoVJfl1r7b41+4okH0gyubX97dafv0jy9tXU9hKllJOTnJwkgwfvkk+MfLl3aMOm7Zprvpnvf//7+fa3v50XX3wxzz33XMaPH5+zzjorzzzzTH7yk5/k7/7u79LZ2blCvy9/+cs5/PDDX9LebdiwYbnkkkty3HHHrf+LgH6yaNGiVc4BaDJzA/pmbkDfzA26barB4H1J3rGKfROT7JJkTK11Set2261b++pKx9Z0BYn31VrftIrxfr/S9gu9Ppdef55Xa/2n3geWUoatYsyuk9e6LElnks5Syr1JTiylXJuuZxLuX2ud13peY3f9S/OHVZ5b9xrn0VLK70opo5Icl+R9qztvH3pf07Ks3feiu8/aHt+j1npZksuSZI89X1cvvndT/RrCKzO39YbhJOns7MxFF12UW265JUly6aWX5uijj87OO++cjo6OnuOeeeaZ3HfffZk+fXq22267JMlTTz2VLbfcMjvttFMWL16cc845J2ecccYK/WBz09nZ6TsOfTA3oG/mBvTN3KDbpnor8YwkA1srz5IkpZRRpZRDk+yY5MlWKDguyZ/26rdH66UfSfKuJD9O8mCSXbrbSylb9n5e31r6tyQnlVIGtcbYrZQyJF2r7rbvq0Mp5Q2llNf3ampP8kj+EPj9tjVe7wB0bpLuew9XDka/keSjSXastd7TxylnJul+MNnxfexf2YNJhpVSXtfa/pskP1qLfsAf4dprr+15uUhvN9xwQ4444oieUDBJHnvssYwbNy6jRo3KAQcckPHjx2fChDU9eQAAAAC6bJJLtWqttZRyTJLJpZQz0vVcwbnpek7e1Ulubq3AuyvJA726PpjkA6WUy5Pcn+QrtdYXWy8R+WIpZcd0/U4mp2tV4trW8/1Syt5Jftq6HXlRkv9Va/1VKeWOUsqcJN9b6TmDg5J8qZSyU7pWAj6c5ORa64JSyleTzEnyeJI7e/W5KMk3W4HorSuVcX26niP4mVWUeWqSq0opZ6Xr9uln1nBNz5dS3p3kulJKW6uOS1fXB3j5Ojo6Vvg/dd3L+Vde1j9p0qRMmjRphbZRo0Zl1qxZAQAAgFdikwwGk6T1Bt93rmL3qm4LHt5XY611dpLD+mjvWGl70krbg3p9npKuYG7lMd61inP+IsmbV7Hv7CRn99H+QJJRvZrO7rXviaz099l6XuG01uajSQ5qharHp+tFLKm1dqbrdubuPqf0+vzDdL2YZOU6hvX6fFeSjr6uAwAAAICN1/oKBp9M8vVSyvLW9oB0rVLLOmzn5RmT5MutNzQvSHLSejjHHqWUG3tt75iuF6MAAAAAsJFZL8FgrXVqul6g0Zd11c7LUGu9Pcl+6/kcL+vtxAAAAAD0n0315SMAAAAAwB9BMAgAAAAADSQYBAAAAIAGEgwCAAAAQAMJBgEAAACggdbLW4lhbW2z5RZ58Pwj+7sMAAAAgMaxYhAAAAAAGkgwCAAAAAANJBgEAAAAgAYSDAIAAABAAwkGAQAAAKCBBIMAAAAA0ECCQQAAAABoIMEgAAAAADSQYBAAAAAAGkgwCAAAAAANJBgEAAAAgAYSDAIAAABAAwkGAQAAAKCBBIMAAAAA0ECCQQAAAABoIMEgAAAAADSQYBAAAAAAGkgwCAAAAAANJBgEAAAAgAYSDAIAAABAAwkGAQAAAKCBBIMAAAAA0ECCQQAAAABooLb+LoBmW7xkWYadeWt/lwHrzNzzj+zvEgAAAGCtWDEIAAAAAA0kGAQAAACABhIMAgAAAEADCQYBAAAAoIEEgwAAAADQQIJBAAAAAGggwSDAerBs2bK88Y1vzIQJE5IkkyZNymtf+9q0t7envb09s2fPXuH4O++8M21tbbn++uuTJI8//nhGjx6d9vb2jBgxIpdeeukGvwYAAAA2b239XQDA5mjKlCnZe++98+yzz/a0XXjhhXnHO97xkmOXLVuWM844I0cccURP26te9ar89Kc/zcCBA7No0aLsu+++edvb3pZdd911g9QPAADA5s+KQYB1bP78+bn11lvzt3/7t2t1/Je+9KUce+yxGTJkSE/blltumYEDByZJXnjhhSxfvny91AoAAEBzCQZ52Uop55ZSppdSbmn9TF9VW3/XCv3h1FNPzQUXXJABA1b8J/ass87KqFGj8uEPfzgvvPBCkuTRRx/NDTfckPe///0vGWfevHkZNWpUXvOa1+SMM86wWhAAAIB1SjDIK3V8rXVCrXVCkuNX0waNcsstt2TIkCEZM2bMCu3nnXdeHnjggdx55515+umn8/nPfz5JV4j4+c9//iUhYpK85jWvyT333JOHH344V1xxRZ544okNcvuwrSMAACAASURBVA0AAAA0g2cMssGVUk5OcnKSDB68Sz4xcmk/VwTrzjXXfDPf//738+1vfzsvvvhinnvuuYwfPz5nnXVWHnzwwSTJG9/4xnzjG9/IYYcdlh//+Me5/fbbkyTPPPNMbrrppjzwwANpb29PZ2dnz7ivetWrcumll+bwww/vj8uCjcaiRYtWmBtAF3MD+mZuQN/MDboJBtngaq2XJbksSfbY83X14nt9Ddl8zL366p7PnZ2dueiii3LLLbfksccey9ChQ1NrzY033pjDDz88HR0deeyxx3qOnzRpUiZMmJB3vOMdue666/KWt7wl22yzTf7nf/4nv/rVr3LBBRdk5MiR/XFZsNHo7OxMR0dHf5cBGx1zA/pmbkDfzA26SWQANoCJEyfmqaeeSq017e3tufTSS1d7/COPPJKxY8emlJJaa0477TShIAAAAOuUYBBgPeno6Oj5v3AzZsxY4/HTpk3r+bz//vvntNNOW0+VAQAAgJePAAAAAEAjCQYBAAAAoIHcSswr8WSSr5dSlre2BySZvoo2AAAAADZCgkFetlrr1CRT+9jVVxsAAAAAGyG3EgMAAABAAwkGAQAAAKCBBIMAAAAA0ECCQQAAAABoIC8foV9ts+UWefD8I/u7DAAAAIDGsWIQAAAAABpIMAgAAAAADSQYBAAAAIAGEgwCAAAAQAMJBgEAAACggQSDAAAAANBAgkEAAAAAaCDBIAAAAAA0kGAQAAAAABpIMAgAAAAADSQYBAAAAIAGEgwCAAAAQAMJBgEAAACggQSDAAAAANBAgkEAAAAAaCDBIAAAAAA0kGAQAAAAABpIMAgAAAAADSQYBAAAAIAGEgwCAAAAQAMJBgEAAACggQSDAAAAANBAgkEAAAAAaKC2/i6AZlu8ZFmGnXlrf5fBZmTu+Uf2dwkAAACwSbBiEAAAAAAaSDAIAAAAAA0kGAQAAACABhIMAgAAAEADCQYBAAAAoIEEgwAAAADQQIJBYLPz/PPP58ADD8x+++2XESNG5JOf/GSS5NBDD017e3va29uz66675uijj06SdHZ2Zscdd+zZ9+lPfzpJMm/evIwbNy777LNPRowYkSlTpvTbNQEAAMC61tbfBQCsawMHDsyMGTMyaNCgLFmyJIccckj+6q/+KrfffnvPMccee2yOOuqonu1DDz00t9xyywrjtLW15eKLL87o0aOzcOHCjBkzJuPHj88+++yzwa4FAAAA1hcrBllrpZRLSykH93cdsCallAwaNChJsmTJkixZsiSllJ79zz77bGbMmNGzYnBVhg4dmtGjRydJtt9+++y999559NFH11/hAAAAsAFZMdhQpZRzkxyUZGmrqS3JzL7aaq3ntrYPSnJhKeW+JL/uNdzgJMcnuXXl9lrrQeujfliTZcuWZcyYMXn44YfzgQ98IGPHju3Zd+ONN+Ytb3lLdthhh562n/70p9lvv/2y66675qKLLsqIESNWGG/u3LmZNWvWCuMAAADApkww2GzH11oXJEkpZackp66iLaWUvZM8lGRZkq/WWid3D1JK6f68qnbY4LbYYovMnj07CxYsyDHHHJM5c+Zk3333TZJcc801+du//dueY0ePHp1HHnkkgwYNyne/+90cffTR+c///M+e/YsWLcqxxx6byZMnrxAmAgAAwKZMMMja+qsk09fFQKWUk5OcnCSDB++ST4xcuoYesPY6Oztf0jZs2LBccsklOe644/LMM8/kJz/5ST784Q/3eey2226bhQsX5qabbsqOO+6YpUuX5mMf+1jGjh2bnXfeuc8+68OiRYs22LlgU2JuQN/MDeibuQF9MzfoJhhkbf1Fkncn2eqPHajWelmSy5Jkjz1fVy++19eQdWfuxI489dRT2XLLLbPTTjtl8eLFOeecc3LGGWeko6Mjl156aY4++ugcccQRPX0ef/zx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8IwaNSrHHHNMFixYkCS5+uqr097e3vMzYMCAzJ49O88991yOPPLIDB8+PCNGjMiZZ57Zn5cFAAAAvEKCQWiItra2XHzxxbn//vszc+bMXHLJJbn//vszfvz4zJkzJ/fcc0/22muvnHfeeUmSiRMnZvbs2Zk9e3auvPLKvPa1r017e3uS5LTTTssDDzyQWbNm5Y477sj3vve9/rw0AAAA4BUQDEJDDB06NKNHj06SbL/99tl7773z6KOP5ogjjkhbW1uS5KCDDsr8+fNf0veaa67J8ccfnyTZdtttM27cuCTJVlttldGjR/fZBwAAANi4tfV3AWx6SinnJjkoydJWU1uSmX211VrP3dD1sWZz587NrFmzMnbs2BXaL7/88hx33HEvOf4b3/hGbrrpppe0L1iwIDfffHM+9KEPrbdaAQAAgPVDMMgrdXytdUGSlFJ2SnLqKtrYyCxatCjHHntsJk+enB122KGn/bOf/Wza2toyceLEFY7/2c9+lm233Tb77rvvCu1Lly7NCSeckA9+8IPZc889N0jtAAAAwLojGGSDK6WcnOTkJBk8eJd8YuTSNfTgj9XZ2ZmkK8z72Mc+lrFjx2bnnXfuaZ8+fXpuvvnmXHzxxfnRj360Qt9LLrkkY8eO7Tm22+c///lss802aW9vf8k+/niLFi3ye4U+mBvQN3MD+mZuQN/MDboJBtngaq2XJbksSfbY83X14nt9Dde3uRM7UmvNiSeemIMPPjiTJ0/u2Td9+vR85zvfyY9+9KPssssuK/Rbvnx5Jk6cmNtvv32FVYFnn312tt1221x33XUZMMCjSteHzs7OdHR09HcZsNExN6Bv5gb0zdyAvpkbdPNf9NAQd9xxR6688srMmDEj7e3taW9vz3e/+92ccsopWbhwYcaPH5/29va8733v6+lz22235TWvec0KoeD8+fPz2c9+Nvfff39Gjx6d9vb2/PM//3N/XBIAAADwR7BUCxrikEMOSa31Je1vfetbV9mno6MjM2fOXKFt991373McAAAAYNNixSAAAAAANJBgEAAAAAAayK3EvBJPJvl6KWV5a3tAkumraAMAAABgIyQY5GWrtU5NMrWPXX21AQAAALARcisxAAAAADSQYBAAAAAAGkgwCAAAAAAN5BmD9KttttwiD55/ZH+XAQAAANA4VgwCAAAAQAMJBgEAAACggQSDAAAAANBAgkEAAAAAaCDBIAAAAAA0kGAQAAAAABpIMAgAAAAADSQYBAAAAIAGEgwCAAAAQAMJBgEAAACggQSDAAAAANBAgkEAAAAAaCDBIAAAAAA0kGAQAAAAABpIMAgAAAAADSQYBAAAAIAGEgwCAAAAQAMJBgEAAACggQSDAAAAANBAgkEAAAAAaCDBIAAAAAA0kGAQAAAAABpIMAgAAAAADdTW3wXQbIuXLMuwM2/t7zL+KHPPP7K/SwAAAAB42awYBAAAAIAGEgwCAAAAQAMJBgEAAACggQSDAAAAANBAgkEAAAAAaCDBIAAAAAA0kGAQAAAAABpIMAjrwEknnZQhQ4Zk33337Wk7/fTTM3z48IwaNSrHHHNMFixYkCT5+c9/nvb29rS3t2e//fbLDTfckCR5/vnnc+CBB2a//fbLiBEj8slPfrJfrgUAAABoBsHgapRS/qSUcm0p5VellF+UUr5bStlrNccPK6XM2cA17lRK+fvV7F9WSpnd62fYhquuOSZNmpTp06ev0DZ+/PjMmTMn99xzT/baa6+cd955SZJ99903d911V2bPnp3p06fnve99b5YuXZqBAwdmxowZufvuu3v2zZw5sz8uBwAAAGiAtv4u4JUqpZyb5KAkS1tNbUm6U5R10f6pJDckuaLWenzrnPsleXWSh9bt1XQppbTVWpeu+cgV7JTk75NMXcX+xbXW9nV8zlWN9dUkQ3s17ZDk8lrrtHUx/sbssMMOy9y5c1doO+KII3o+H3TQQbn++uuTJNtuu21P+/PPP59SSpKklJJBgwYlSZYsWZIlS5b07AMAAABY1zbZYLDl+FrrgqRr5VySU9dh+7gkS2qtl3afrNZ6d+uYQUluSvL/JNkyydm11ptah7WVUq5OMjrJfUn+d631uVLKmCRfSDIoyW+TTKq1PlZK6UwyO8khSa4ppYxM8myS/ZP8SZKP1lqvb5339CTvTDIwyQ211k8mOT/Jn5VSZif5Qa319DX90kopk5K8vVXLFqWUI/u6ntbqwu8l+XGSNyd5NMlRtdbFpZTXJbk0yS5JliX56yS/r7VO6HWe9iSrDCWb5PLLL89xxx3Xs/2zn/0sJ510Uh555JFceeWVaWvrmorLli3LmDFj8vDDD+cDH/hAxo4d218lAwAAAJu5TT0YXJ/2TfKLVex7PskxtdZnSymDk8wspXynte8NSd5Ta72jlHJ5kr8vpUxJ8qV0hWpPlVKOS/LZJCe1+mxVa90/SUop09K16u6QJMOTfCfJ9aWUI5K8PsmBSUqS75RSDktyZpJ9V7MqcJtWaJgkv661HtP6PDrJqFrr06WUttVcz+uTnFBr/btSyjeTHJvkqiRXJzm/1npDKWXrvIzb0kspJyc5OUkGD94lnxi5ThYs9pvOzs4kyeOPP57f//73PdvdrrrqqixYsCC77bbbCvsuueSSPPLII/n4xz+e7bbbLltttVWSZPLkyVm0aFHOOeecDB8+PK997Ws30JWwMVm0aNFLvkuAuQGrYm5A38wN6Ju5QTfB4CtTknyuFcwtT7Jbum4xTpJ5tdY7Wp+vSvLBJNPTFTT+oHVr6BZJHus13jdWGv/GWuvyJPeXUrrHPaL1M6u1PShdod1/r6HWVd1K/INa69NrcT2/rrV2B4u/SDKslLJ9kt1qrTckSa31+SRrfdtrrfWyJJclyR57vq5efO+m/TWcO7Gj68+5c7Pddtulo6OjZ9+0adNy33335Yc//OEKtxD3dsUVV2TnnXfO/vvvv0L7L3/5y/zud7/Lu9/97vVVOhuxiFeExwAAIABJREFUzs7OFb5LQBdzA/pmbkDfzA3om7lBNy8fWbX7koxZxb6J6bqFdkwrdHsiydatfXWlY2u6grf7aq3trZ+RtdYjeh3z+5X6vNDrc+n153m9xnhdrfVfXuY19db7nKu7nt61LIswea1Nnz49F1xwQb7zne+sEAr++te/ztKlXaskH3nkkTzwwAMZNmxYnnrqqZ43Fy9evDg/+MEPMnz48H6pHQAAANj8CQZXbUaSga3bXpMkpZRRpZRDk+yY5Mla65JSyrgkf9qr3x6llDe1Pr8rXc/nezDJLt3tpZQtSykjXmY9/5bkpNbzDVNK2a2UMiTJwiTbv4Lr62111/MStdaFSeaXUo5u1TKwlNL3criGOOGEE/KmN70pDz74YHbffff8y7/8S0455ZQsXLgw48ePT3t7e973vvclSX784x9nv/32S3t7e4455phMnTo1gwcPzmOPPZZx48Zl1KhROeCAAzJ+/PhMmDBhDWcGAAAAeGWs/lqFWmstpRyTZHIp5Yx0PVdwbrpeTHJ1kptLKfcmuSvJA726PpjkA63nC96f5Cu11hdLKe9I8sVSyo7p+r1PTteqxLWt5/ullL2T/LR1y+6iJP+r1vqrUsodpZQ5Sb63Ni8f6cPqrmdV/ibJP5VSPp1kSbpePtJY11xzzUva3vOe9/z/7N1rmF5VfT/87yIhHIwFNSAExRgBOSQhSOgTLMpQDKC05Q/6KEKV4z8UpEJ7YaTqgxTbEjkUKAqYeiDISQE1yElsYFBQBIITDtaAh3gCoSinhEgyZD0v5k46hJlkgNwzIfvzua652Pu39177d4d7vflea9+7z3M/9KEP5UMf+tAL6hMmTMiPf/zjPq4AAAAAWP0EgytRa30oPW8B7suu/dT7fPaz9Tt97+yj3rHC/qEr7I/stX1OknP6GOOgfnp53vW9ahcmubDX/mPp//OM63XeGb22H0zyl71PHOhvDAIAAAAw9F7JweCjSS4qpSxt7a+Tnpd8ZDXWeXGeKqV8q9f+iCRfGKpmAAAAAOjfKzYYrLWel+S8fg6vrjovQq31pKHuAQAAAICB8fIRAAAAAGggwSAAAAAANJBgEAAAAAAaSDAIAAAAAA30in35CGuHDdYdlnnT9x3qNgAAAAAax4pBAAAAAGggwSAAAAAANJBgEAAAAAAaSDAIAAAAAA0kGAQAAACABhIMAgAAAEADCQYBAAAAoIEEgwAAAADQQIJBAAAAAGggwSAAAAAANJBgEAAAAAAaSDAIAAAAAA0kGAQAAACABhIMAgAAAEADCQYBAAAAoIEEgwAAAADQQIJBAAAAAGggwSAAAAAANJBgEAAAAAAaSDAIAAAAAA0kGAQAAACABhIMAgAAAEADCQYBAAAAoIGGD3UDNNuiJc9lzInXDnUbqzR/+r5D3QIAAADAamXFIAAAAAA0kGAQAAAAABpIMAgAAAAADSQYBAAAAIAGEgwCAAAAQAMJBgEAAACggQSDAAAAANBAgkEYoMMPPzybbrppxo0bt7z2xz/+MVOmTMnWW2+dKVOm5PHHH0+SdHZ2ZqONNsrEiRMzceLEnHLKKSsdBwAAAGCwCQZhgA499NDccMMNz6tNnz49e+65Zx588MHsueeemT59+vJj73jHO9LV1ZWurq6cdNJJKx0HAAAAYLANH+oGGHqllJOTTE7S3SoNT3J7P7W8mHqt9eR29T3Y3vnOd2b+/PnPq82aNSudnZ1JkkMOOSQdHR357Gc/+6LHAQAAABhsgkGWObDW+kSSlFI2TnJ8P7X+zl1Zfa31yCOPZPPNN0+SbLbZZnnkkUeWH/vhD3+YHXfcMaNHj84ZZ5yRHXbYYajaBAAAAHgBwSCDrpQyNcnUJBk1apOcNL57FVcMvWWrAn//+99n4cKFy/e7u7uXbyfJc889l87OzixcuDAXX3xxNthgg9x+++3Ze++9c/HFFy8/b8VxYEULFizw/YA+mBvQN3MD+mZuQN/MDZYRDDLoaq0zksxIki3HblXPvHfN/xrOP7ij57/z5+dVr3pVOjp69rfYYou89a1vzeabb56HH344o0ePXn5smY6OjlxwwQUZN25cRo0a1ec4sKLOzk7fD+iDuQF9Mzegb+YG9M3cYBkvH4GX4W/+5m8yc+bMJMnMmTOz3377JelZEVhrTZLccccdWbp0aV73utcNWZ8AAAAAKxIMwgB98IMfzK677pp58+blDW94Q770pS/lxBNPzHe/+91svfXW+a//+q+ceOKJSZIrr7wy48aNy4477piPfvSjufzyy1NK6XccAAAAgMG25j/DCWuIyy67rM/67NmzX1A79thjc+yxx76ocQAAAAAGkxWDAAAAANBAVgySJI8muaiUsrS1v06SG/qp5SXUAQAAAFjDCAZJrfW8JOf1caiv2kupAwAAALCG8SgxAAAAADSQYBAAAAAAGkgwCAAAAAANJBgEAAAAgAby8hGG1AbrDsu86fsOdRsAAAAAjWPFIAAAAAA0kGAQAAAAABpIMAgAAAAADSQYBAAAAIAGEgwCAAAAQAMJBgEAAACggQSDAAAAANBAgkEAAAAAaCDBIAAAAAA0kGAQAAAAABpIMAgAAAAADSQYBAAAAIAGEgwCAAAAQAMJBgEAAACggQSDAAAAANBALzoYLKW8ppQyoR3NAAAAAACDY0DBYCmls5TyZ6WU1ya5O8l/llL+vb2tAQAAAADtMtAVgxvVWp9KckCSi2qt/0+Sd7WvLQAAAACgnQYaDA4vpWye5P1JrmljPwAAAADAIBhoMHhKku8k+Xmt9c5SytgkD7avLQAAAACgnYYP5KRa6xVJrui1/4sk721XUwAAAABAew305SPblFJml1Lua+1PKKV8qr2tAQAAAADtMtBHif8zyT8lWZIktdZ7khzYrqYAAAAAgPYa0KPESTastd5RSuld625DPzTMoiXPZcyJ17b1HvOn79vW8QEAAABeiQa6YvCxUspbktQkKaW8L8nDbesKAAAAAGirga4Y/EiSGUm2LaX8Lskvkxzctq4AAAAAgLZaZTBYSlknyaRa67tKKa9Ksk6t9en2twYAAAAAtMsqHyWutS5NMq21vVAoCAAAAACvfAP9jcH/KqWcUEp5Yynltcv+2toZAAAAANA2A/2NwQ+0/vuRXrWaZOzqbQcAAAAAGAwDCgZrrW9udyMAAAAAwOAZUDBYSvlwX/Va60Wrtx1onyeeeCJHHnlk7rvvvpRS8uUvfznf+MY38u1vfzsjRozIW97ylnzlK1/JxhtvnEsuuSSnn3768mvvueee3H333Zk4ceIQfgIAAACA1WegvzG4S6+/dyQ5OcnftKknaIvjjjsu++yzT376059m7ty52W677TJlypTcd999ueeee7LNNtvk1FNPTZIcfPDB6erqSldXV7761a/mzW9+s1AQAAAAWKsM9FHiv++9X0rZOMnlbemItimlnJxkcpLuVml4ktv7qWV11GutJ6/Oz/BSPfnkk/ne976XCy+8MEkyYsSIjBgxInvttdfycyZPnpwrr7zyBddedtllOfDAAwerVQAAAIBBMdCXj6xoYRK/O/jKdGCt9YlkecB7fD+1/s59KfUh98tf/jKbbLJJDjvssMydOzc777xzzjnnnLzqVa9afs6Xv/zlfOADH3jBtV/72tcya9aswWwXAAAAoO0G+huD307PW4iTnsePt09yRbuaYu1WSpmaZGqSjBq1SU4a372KK16ezs7OzJs3L3PmzMmhhx6aQw89NOeee26OPvroHH744UmSiy++OE888US22GKLdHZ2Lr/2Jz/5SWqteeyxx55Xh3ZbsGCB7xz0wdyAvpkb0DdzA/pmbrDMQFcMntFruzvJr2qtv21DPzRArXVGkhlJsuXYreqZ977UhasDM//gjmy77bY59dRTc8wxxyRJhg0blunTp6ejoyMXXnhh7r///syePTsbbrjh866dNWtWjjzyyHR0dLS1R1hRZ2en7x30wdyAvpkb0DdzA/pmbrDMQF8+8p5a6y2tv9tqrb8tpXy2rZ3BarTZZpvljW98Y+bNm5ckmT17drbffvvccMMNOe2003L11Ve/IBRcunRpvv71r/t9QQAAAGCtNNClWlOSfHyF2rv7qMEa69xzz83BBx+cxYsXZ+zYsfnKV76SXXbZJc8++2ymTJmSpOcFJBdccEGS5Hvf+17e+MY3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gwSDAAAAANBBgkEAAAAA6CDBIAAAAAB0kGAQAAAAADpIMAgAAAAAHSQYBAAAAIAOmjbRDdBt9z+4KrNPuWy9Y1acccQW6gYAAACgO6wYBAAAAIAOEgwCAAAAQAcJBgEAAACggwSDAAAAANBBgkEAAAAA6CDBIAAAAAB0kGCQSe+2227LYYcdlr333jtz5szJWWedlSS56KKLMmfOnEyZMiXXXXfdmvG//e1v8+pXvzr77LNP9ttvvwwNDU1Q5wAAAACT17SJbgAeybRp03LmmWdm3rx5ue+++zJ//vwsXLgwc+fOzec///mccMIJa40/99xzkyQ33nhj7rrrrhx++OG59tprM2WKHBwAAABgNUkJk94uu+ySefPmJUl22GGH7LXXXrnjjjuy1157Zc8993zY+JtvvjnPe97zkiSzZs3KjBkz1lpRCAAAAIAVg51SVacnOSjJyl5pWpKrx6hlPOqttdPH8zOsWLEiy5Yty4IFC8Ycs99+++XSSy/NK1/5ytx2221ZunRpbrvtthx44IHj2QoAAADAVk0w2D1Ht9buTZKqmpHkxDFqY43dlPq4GB4ezqJFi7J48eLsuOOOY457zWtek29/+9s54IAD8gd/8Ad51rOelalTp45nKwAAAABbPcEgW1xVHZ/k+CSZOXPnnLrPyvWOHxoaysqVK/PWt741CxYsyE477bTWC0XuvffeLF26NMPDw2tqL37xi/PiF784SfL6178+9957r5eQsFUZHh72nYU+zA3oz9yA/swN6M/cYDXBIFtca+2cJOckyW67P72deeP6v4a3/ulzc+yxx+aQQw7J4sWLH3Z8xowZmT9/fg444IAkya9//eu01rLddtvly1/+cnbaaaccd9xx4/45YHMaGhrK4ODgRLcBk465Af2ZG9CfuQH9mRusJhhk0rvqqqtywQUXZJ999snAwECS5N3vfnd+85vf5A1veEPuvvvuHHHEERkYGMiXvvSl3HXXXXnhC1+YKVOm5ClPeUouuOCCCf4EAAAAAJOPYJBJ79BDD01rre+xo4466mG12bNn55ZbbtncbQEAAABs1aZMdAMAAAAAwJYnGAQAAACADvIocbfcleQTVfVQb39KkiVj1DKOdQAAAAAmGcFgh7TWzk5ydp9D/WrjWQcAAABgkvEoMQAAAAB0kGAQAAAAADpIMAgAAAAAHSQYBAAA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\n",
      "text/plain": [
       "<Figure size 1440x2160 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "### 特征重要性\n",
    "from pylab import mpl \n",
    "# mpl.rcParams['font.sans-serif'] = ['FangSong'] \n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "from xgboost import plot_importance\n",
    "fig,ax = plt.subplots(figsize=(20,30))\n",
    "plot_importance(model,height=0.5,max_num_features=64,ax=ax)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "                     feature  importance\n",
      "2                   keyword       25477\n",
      "1                   alcohol       16205\n",
      "10                     year       12589\n",
      "3                        特性        9406\n",
      "5                        口感        9345\n",
      "8                        颜色        7279\n",
      "7                        产区        7117\n",
      "13                      原产地        6927\n",
      "4   赤霞珠（Cabernet Sauvignon）        4773\n",
      "9                        其它        4543\n",
      "0                     国产/进口        3752\n",
      "14               梅洛（Merlot）        3414\n",
      "18     西拉/设拉子（Syrah/Shiraz）        2616\n",
      "12                       甜度        2272\n",
      "21      品丽珠（Cabernet Franc）        1233\n",
      "17                     白葡萄酒        1051\n",
      "15                    桃红葡萄酒         627\n",
      "19          黑皮诺（Pinot Noir）         583\n",
      "11                     红葡萄酒         582\n",
      "16          霞多丽（Chardonnay）         580\n",
      "20           佳美娜（Carmenere）         568\n",
      "6   蛇龙珠（Cabernet Gernischt）         496\n",
      "24             马尔贝克（Malbec）         342\n",
      "26     长相思（Sauvignon Blanc）         341\n",
      "27                   起泡酒/香槟         295\n",
      "29                    果味葡萄酒         219\n",
      "25                 冰酒/贵腐/甜酒         217\n",
      "28         桑娇维塞（Sangiovese）         123\n",
      "31           匹诺塔吉（Pinotage）         101\n",
      "23           仙粉黛（Zinfandel）          98\n",
      "22                佳美（Gamay）          48\n",
      "30            雷司令（Riesling）          33\n",
      "32           内比奥罗（Nebbiolo）           2\n"
     ]
    }
   ],
   "source": [
    "feature_importance=pd.DataFrame(list(model.get_booster().get_fscore().items()),\n",
    "columns=['feature','importance']).sort_values('importance', ascending=False)\n",
    "print('',feature_importance)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "掌握特征的重要性排列之后，我们可以选择部分特征再做训练，对比之前的效果："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(12761, 22)\n",
      "(12761,)\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/usr/local/python3/lib/python3.6/site-packages/ipykernel_launcher.py:14: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n",
      "  \n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "accuarcy: 68.59%\n"
     ]
    }
   ],
   "source": [
    "# 掌握特征重要性之后重新再训练\n",
    "choose = list(feature_importance[feature_importance.importance>400][\"feature\"])\n",
    "# 划分X,Y\n",
    "# X = df[df.columns.difference(['price'])]  \n",
    "X = df[choose]\n",
    "Y = df['price']\n",
    "print(X.shape)\n",
    "print(Y.shape)\n",
    "\n",
    "from sklearn.preprocessing import LabelEncoder\n",
    "le = LabelEncoder()\n",
    "features = [col for col in X.columns.values if X[col].dtype == \"object\"]         #筛选出object类型的特征\n",
    "for f in features:\n",
    "    X[f] = le.fit_transform(X[f])\n",
    "    \n",
    "    \n",
    "from sklearn.model_selection import train_test_split  \n",
    "\n",
    "# 划分数据训练集，测试集\n",
    "# 80%训练集，20%的测试集；为了复现实验，设置一个随机数,划分结果是确定的\n",
    "x_train, x_test, y_train, y_test = train_test_split(X, Y, test_size = 0.2, random_state = 42 )  \n",
    "\n",
    "# 模型相关（载入模型--训练模型--模型预测）\n",
    "from xgboost import XGBClassifier\n",
    "model = XGBClassifier(learning_rate=0.25, n_estimators=100, objective= \"multi:softmax\", num_class=8, max_depth=12, subsample =0.95)\n",
    "model.fit(x_train,y_train)            # 训练模型（训练集）\n",
    "y_pred = model.predict(x_test)        # 模型预测（测试集），y_pred为预测结果\n",
    "\n",
    "# 性能评估\n",
    "from sklearn.metrics import accuracy_score   # 准确率\n",
    "accuracy = accuracy_score(y_test,y_pred)\n",
    "print(\"accuarcy: %.2f%%\" % (accuracy*100.0))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "可见模型的准确率并不是很高，提高准确率的方法有三个方向：\n",
    "\n",
    "1、区间数设置：我们定义的红酒价格区间是自己设立的，可以根据真实数据的效果修改区间数，再做尝试构建预测模型。\n",
    "\n",
    "2、准确的数据：数据的来源是京东，且在处理价格的时候是采用jieba分词及语法的形式对瓶数进行提取，可能会存在识别错的情况，即引入了脏数据，可以把处理条件更严格一些，或者爬取更为准确的数据，或者加入人工删选的步骤保证数据的准确度。\n",
    "\n",
    "3、算法选择：本案例中采用的方法是xgboost，采用的是其默认参数，可以修改参数优化模型，也可以尝试其他算法，同样的，还可以做多算法的融合结果。\n",
    "\n",
    "本案例不做拓展，学生可尝试从这三个方向提高其准确率。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 步骤8：保存模型\n",
    "\n",
    "<div class=\"alert alert-success alertsuccess\" style=\"margin-top: 10px\">\n",
    "代码示例：\n",
    "</div>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 103,
   "metadata": {},
   "outputs": [],
   "source": [
    "pickle.dump(model, open(\"pima.pickle.dat\", \"wb\"))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "************************************************\n",
    "## 六、实验总结\n",
    "本节完整的学习构建了一个机器学习模型，流程如下：\n",
    "\n",
    "1.读取数据（判别是否需要采样）\n",
    "\n",
    "2.处理数据\n",
    "\n",
    "3.划分数据\n",
    "\n",
    "4.训练模型\n",
    "\n",
    "5.特征选择再训练\n",
    "\n",
    "下节，我们将学习如何使用训练出来的模型。\n",
    "<div class=\"alert alert-block alert-info\" style=\"margin-top: 20px\" >\n",
    "<li><a href=\"#ref10\" >返回目录表</a></li>   \n",
    "<br>\n",
    "<p></p>\n",
    "</div>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "*****************************************************************\n",
    "************************************************************\n",
    "<a id=\"ref12\"></a>\n",
    "<h2 align=center>实验4-2 基于模型辅助商家实现价格发现</h2>\n",
    "\n",
    "建议课时：20分钟\n",
    "## 一、实验目的\n",
    "\n",
    "1、了解数据预测的处理流程\n",
    "\n",
    "2、了解大屏展示与业务相结合的方法\n",
    "\n",
    "## 二、实验环境\n",
    "Python3开发环境，第三方包有pandas，sklearn，xgboost，pickle\n",
    "\n",
    "## 三、实验原理\n",
    "在机器学习中，我们常常需要把训练好的模型存储起来，这样在进行决策时直接将模型读出，而不需要重新训练模型，这样就大大节约了时间。Python提供的pickle模块就很好地解决了这个问题，它可以序列化对象并保存到磁盘中，并在需要的时候读取出来，任何对象都可以执行序列化操作。本节使用pickle保存和读取模型，并展现如何利用模型进行预测。\n",
    "\n",
    "## 四、实验步骤\n",
    "本节处理的内容有：\n",
    "\n",
    "1.基于模型预测\n",
    "本节讲述的是如何拿现有模型对单条数据进行预测，有此基础就可以对海关的红酒数据进行价格区间预测，跟报关单上的价格做对比审核。\n",
    "\n",
    "### 步骤1:读取模型，并对数据进行预测\n",
    "注意此处需要对数据进行转换，利用上一个小节保存下来的encoders.dict文件对数据做相同的转换。\n",
    "<div class=\"alert alert-success alertsuccess\" style=\"margin-top: 10px\">\n",
    "代码示例：\n",
    "</div>\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 108,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "the true result:  0-50\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/usr/local/python3/lib/python3.6/site-packages/ipykernel_launcher.py:20: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "   alcohol  keyword   year  产区  仙粉黛（Zinfandel）  佳美娜（Carmenere）  佳美（Gamay）  其它  \\\n",
      "0     12.0      189  99999   2               0               0          0   1   \n",
      "\n",
      "   内比奥罗（Nebbiolo）  冰酒/贵腐/甜酒       ...         蛇龙珠（Cabernet Gernischt）  \\\n",
      "0               0         0       ...                               0   \n",
      "\n",
      "   西拉/设拉子（Syrah/Shiraz）  赤霞珠（Cabernet Sauvignon）  起泡酒/香槟  \\\n",
      "0                     0                        0       0   \n",
      "\n",
      "   长相思（Sauvignon Blanc）  雷司令（Riesling）  霞多丽（Chardonnay）  颜色  马尔贝克（Malbec）  \\\n",
      "0                     0              0                0   0             0   \n",
      "\n",
      "   黑皮诺（Pinot Noir）  \n",
      "0                0  \n",
      "\n",
      "[1 rows x 33 columns]\n",
      "the prediction of test:  ['0-50']\n"
     ]
    }
   ],
   "source": [
    "# 加载模型\n",
    "import xgboost as xgb\n",
    "# bst = xgb.Booster({'nthread':4}) #init model\n",
    "# bst.load_model(\"xgb1.model\") # load data\n",
    "bst = pickle.load(open(\"pima.pickle.dat\", \"rb\"))\n",
    "\n",
    "# 载入测试数据\n",
    "test_data = df.iloc[[0]]\n",
    "test = test_data[test_data.columns.difference(['price'])]     \n",
    "Y = test_data['price']\n",
    "print(\"the true result: \",Y[0])\n",
    "\n",
    "# 转换数据\n",
    "coders = {}\n",
    "with open(\"encoders.dict\", \"rb\") as f:\n",
    "    coders = pickle.load(f)\n",
    "aa = LabelEncoder()\n",
    "for x,y in coders.items():\n",
    "    aa.classes_ = y\n",
    "    test[x] = aa.transform(test[x])\n",
    "print(test)\n",
    "\n",
    "# 预测\n",
    "p = bst.predict(test[choose])\n",
    "print(\"the prediction of test: \",p)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 步骤2:生成报表\n",
    "\n",
    "我们得到了如何预测红酒价格区间的方法，本节讲述的是如何展示结果预测之后的效果，不仅仅是从数据的维度，从业务角度出发提供更多的展现效果和形态。\n",
    "\n",
    "此处介绍一个概念：风险分析——结合业务将“风险”两字体现出来，因此设立了以下几个风险评估的维度。\n",
    "将通过算法模型找出的平台上有问题的定价以矩阵的形式展现出来，总体将风险分为三个等级：\n",
    "\n",
    " 蓝色：风险等级较低，可以暂时观察；\n",
    " \n",
    " 黄色：风险等级中等，建议采取行动；\n",
    " \n",
    " 红色：风险等级较高，建议立即采取行动。\n",
    " \n",
    "### 风险等级定义方法：\n",
    "\n",
    "#### 风险频率等级： \n",
    "按店铺的有问题报价数量统计，计算方法为统计该企业在一定时间段内有风险的报关单数除以该店铺在这个时间段内所有的在售数；\n",
    "\n",
    "用A、B、C、D、E来表示等级，每个等级的区间为20%，即：\n",
    "\n",
    "A：该店铺在这个时间段内有20%或以下的价格存在风险；\n",
    "E：该店铺在这个时间段内有80%或以上的价格存在风险\n",
    "风险后果等级：\n",
    "用数字Ⅰ-Ⅴ表示等级，Ⅰ为最轻，Ⅴ为最严重；\n",
    "申报不规范类型风险：\n",
    "以缺少关键定价要素数量为划分标准：\n",
    "如缺少一项关键定价信息，风险等级为Ⅱ；缺少两项为Ⅲ；缺少3项为Ⅳ；\n",
    "低价风险类型风险：\n",
    "以该平台单价与价格区间的最低值范围差为标准划分：\n",
    "如Ⅰ为单价与最低值的差距在5%以内；\n",
    "Ⅴ为单价与最低值的差距在20%以上；\n",
    "\n",
    "基于属性信息和价格信息，可以依据属性类别的重合程度，来进一步确定自己的价格范围，从而在最类似的产品中制定自己最具竞争力和性价比的价格，在激烈的竞争环境中获取自己独特的用户群体和市场。同时如果结合这一风险指标，判断供应商的风险等级，则更能够确保（尤其是非生产型企业）自身产品和价格上的对应以及定价的合理性。"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
